export interface IState {
  /** 状态属性说明 */
  xxx: number
}

export interface IValue extends IState, IBaseValue {
  /** 非状态属性说明 --- 稳定不变 */
  yyy: boolean
  /** 方法说明 --- 持久化函数 */
  zzz: () => void
}

export interface IBaseValue {
  /**
   * 以同步方式进行值变更订阅，记得清理（useEffect、useLayoutEffect 则是异步进行） --- 持久化函数
   */
  subscribe: (listener: (value: IValue, prevValue: IValue) => void) => () => void
  /**
   * 获取最新值 --- 持久化函数
   * - 在异步中使用
   * - 为减少依赖项而使用
   */
  getValue: () => IValue
  /**
   * 变更状态 --- 持久化函数
   * - 深层数据操作可使用 `import { produce } from 'immer'`
   *   - [示例](https://immerjs.github.io/immer/produce#example)
   */
  setState: (state: Partial<IState> | ((prevState: IState) => Partial<IState>)) => void
}

export type TMethods = {
  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
  [K in keyof Omit<IValue, keyof IBaseValue> as IValue[K] extends Function ? K : never]: IValue[K]
}
